package com.study.strategy.v1;

/**
 * 策略模式
 * 比如现在有一个游戏里面有两款僵尸 一个普通僵尸 一个手拿着旗子的僵尸 他们都有一样的行为 但是外观不同
 */
public class StrategyTestV1 {
    public static void main(String[] args) {

        AbstractZombie abstractZombie1 = new NormalZombie();
        abstractZombie1.display();
        abstractZombie1.move();
        abstractZombie1.attack();

        System.out.println("----------------------------");

        AbstractZombie abstractZombie2 = new FlagZombie();
        abstractZombie2.display();
        abstractZombie2.move();
        abstractZombie2.attack();

        //比如这时候版本迭代了 多了款僵尸 大头僵尸 他跟抽象僵尸模板一模一样但是攻击方式是头撞 那么我们怎么做呢? 很简单继承这个AbstractZombie 覆盖 攻击方式即可
        //那么这时候版本又迭代了, 多了街舞僵尸 他跟大头僵尸一模一样 但是走路是一边跳街舞一边走 那么我们怎么做呢？  继承大头僵尸 然后覆盖父类的 走路 方法即可
        //.....
        //那么以后版本一直这样迭代呢 是不是所有东西就都混在一起了 实现要是一复杂 特征要是一多 以后就理不清了 那么我们要怎么做? 策略模式解决
        //怎么思考设计模式？ 剥离变化的东西 抽取固定的东西  参考v2


    }
}


//抽象僵尸模板
abstract class AbstractZombie{

    //外观方法
    public abstract void display();

    public void attack(){
        System.out.println("咬");
    }

    public void move(){
        System.out.println("一步一步走");
    }

}

class NormalZombie extends AbstractZombie{

    @Override
    public void display() {
        System.out.println("我是普通僵尸");
    }
}

class FlagZombie extends AbstractZombie{

    @Override
    public void display() {
        System.out.println("我是手拿旗子僵尸");
    }
}


